package cn.demoncat.util.webservice;

import cn.demoncat.util.exception.BizErrorRuntimeException;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.rpc.client.RPCServiceClient;

import javax.xml.namespace.QName;

/**
 * WebService Axis2 客户端
 *
 * @author 延晓磊
 * @since 2021年08月19日
 */
public class AxisClientUtil {

    /**
     * 发起请求（动态调用）
     *
     * @param namespace     Namespace URI of the QName
     * @param localPart     local part of the QName
     * @param wsdl          WSDL地址
     * @param method        请求方法
     * @param params        请求参数
     */
    public static String request(String namespace, String localPart, String wsdl, String method, Object ... params) {
        try {
            // 使用RPC方式调用WebService
            RPCServiceClient serviceClient = new RPCServiceClient();
            // 指定WSDL端点
            serviceClient.getOptions().setTo(new EndpointReference(wsdl));
            // 指定调用方法
            serviceClient.getOptions().setAction(method);
            // 指定请求超时
            serviceClient.getOptions().setTimeOutInMilliSeconds(1800_000);
            // 命名空间
            QName qname = new QName(namespace, localPart);
            // 调用服务
            OMElement element = serviceClient.invokeBlocking(qname, params);
            return element.getFirstElement().getText();
        } catch (Exception e) {
            throw new BizErrorRuntimeException("发起AXIS请求失败", e);
        }
    }

    /**
     * 发起请求（动态调用）
     *
     * @param namespace     Namespace URI of the QName
     * @param localPart     local part of the QName
     * @param wsdl          WSDL地址
     * @param user          用户
     * @param pwd           密码
     * @param method        请求方法
     * @param params        请求参数
     */
    public static String request(String namespace, String localPart, String wsdl, String user, String pwd,String method, Object ... params) {
        try {
            // 使用RPC方式调用WebService
            RPCServiceClient serviceClient = new RPCServiceClient();
            // 指定WSDL端点
            serviceClient.getOptions().setTo(new EndpointReference(wsdl));
            // 指定调用方法
            serviceClient.getOptions().setAction(method);
            // 指定请求超时
            serviceClient.getOptions().setTimeOutInMilliSeconds(1800_000);
            // 指定用户密码
            serviceClient.getOptions().setUserName(user);
            serviceClient.getOptions().setPassword(pwd);
            // 命名空间
            QName qname = new QName(namespace, localPart);
            // 调用服务
            OMElement element = serviceClient.invokeBlocking(qname, params);
            return element.getFirstElement().getText();
        } catch (Exception e) {
            throw new BizErrorRuntimeException("发起AXIS请求失败", e);
        }
    }
}
